#include <crow/http_response.h>

#include "common/api/client.h"

#include "common/log/crow_logger.hpp"
#include "common/log/log.h"

#include "common/more/uuid.h"

#include "common/helpers/container_helper.hpp"
#include "common/helpers/crow_helper.h"

#include "ui_controller.h"

#include "ui_logout_handler.h"

namespace Ui
{

void LogoutHandler::setup(crow::App<>& crowApplication, UiController* controller)
{
    CROW_ROUTE(crowApplication, "/logout")
        .methods("GET"_method)(
            [controller](const crow::request& request)
            {
                const Uuids::Uuid sessionUuid = Common::currentSessionUuid(request);
                const auto session = controller->session(sessionUuid);
                if (!session)
                {
                    // TODO: Обработать попытку выйти с несуществующей сессией.
                    crow::response response = Common::redirect("/");
                    Common::setSessionUuid(response, Uuids::nilUuid());
                    return response;
                }

                const auto user = session->user();
                const std::string userLogin = (user) ? user->login() : "";

                // TODO: Что-то сделать с logoutResult.
                const auto logoutResult = controller->datenaroGate()->logout(
                    sessionUuid,
                    userLogin
                );

                controller->delSession(sessionUuid);

                LOG_INFO << userLogin << " | " << "Успешный выход из системы.";

                crow::response response = Common::redirect("/");
                Common::setSessionUuid(response, Uuids::nilUuid());
                return response;
            }
        );
}

} // namespace Ui
